<?
include('includes/loader.inc.php');

// Si hay que redirigir, redirijo y termino
if ($_GET['redir']) {
	include(CONFIG_DOCUMENT_ROOT.'includes/controller/'.$_GET['obj'].'/'.$_GET['obj'].'.php');
	exit;
}

// Instancio Router
$router = Router::getInstance();

// Instancio Load
$load = Load::getInstance();

// Define si el controlador y el metodo fue detectado automaticamente
$autodetect = false;

// Me fijo si existe el prefijo y lo quito
$prefix = $router->getPrefix($_SERVER['REQUEST_URI']);

//echo "<pre>prefix: $prefix</pre>\n";

// Cargo el prefix en el load
$load->prefix($router->prefixPath($prefix));

// Obtengo la url
if (!($url = $router->getRoute($_SERVER['REQUEST_URI'])) || !method_exists($url['controller'].'Controller', $url['method'])) {

	// Matcheo la url
	preg_match('/\/([^\/]*)\/?([^\/]*)\/?(.*)/i', $_SERVER['REQUEST_URI'], $matches);

	// Obtengo el controlador (Pruebo prefix+controller, prefix class, controller)
	$controller = false;
	if ($prefix) {
		if (!$controller && class_exists($prefix.ucfirst($matches[1]).'Controller')) 
			$controller = $prefix.ucfirst($matches[1]).'Controller';
		if (!$controller && class_exists($prefix.'Controller')) 
			$controller = $prefix.'Controller';
	}
	else if (!$controller && class_exists($matches[1].'Controller')) 
		$controller = $matches[1].'Controller';
	if (!$controller && CONFIG_SCAFFOLDING && ($scaffold = true))
		$controller = 'Controller';

	// Obtengo el metodo
	$method = false;
	if (!$method && is_callable($controller.'::'.$matches[2]))
		$method = $matches[2];
	if (!$method && is_callable($controller.'::'.$matches[1]))
		$method = $matches[1];
	if (!$method && CONFIG_SCAFFOLDING)
		$method = 'index';

	// Obtengo el modelo
	if ($matches[1])
		$model = $matches[1];
		
	// Spliteo los parametros
	$args = ($matches[3])? explode('/', preg_replace('/(.*)\/$/', '\\1', $matches[3])) : null;

	$url = array('controller' => $controller, 'model' => $model, 'method' => $method, 'params' => $args);

	if (preg_match('/.+?\..{3}/', $url['model']))
		$url = null;

/*
	if (!$matches[1]))
		// Seteamos que fue un autodetect
		$autodetect = true;

		// Si existe el controlador/metodo, lo uso
		if (method_exists(($prefix? $prefix.ucfirst($matches[1]).'Controller' : $matches[1].'Controller'), (($matches[2])? $matches[2] : 'index'))) {
			$controller = $prefix? $prefix.ucfirst($matches[1]).'Controller' : $matches[1].'Controller';
			$method = ($matches[2])? $matches[2] : 'index';
		}
		// Pruebo el scaffolding
		else if (CONFIG_SCAFFOLDING) {
			$controller = strtolower((string)$prefix).'Controller';
			$method = method_exists($controller, $url['method'])? $url['method'] : $matches[2];
			if (!$method) $method = 'index';
			$model = $matches[1];
			$scaffold = true;
		}

		// Spliteo los parametros
		$args = ($matches[3])? explode('/', preg_replace('/(.*)\/$/', '\\1', $matches[3])) : null;

		$url = array('controller' => $controller, 'model' => $model, 'method' => $method, 'params' => $args);

	}
*/
	
}
else
	$url['controller'] .= 'Controller';

/*
echo '<pre>MATCHES: '.print_r($matches, true).'</pre>';
echo '<pre>URL: '.print_r($url, true).'</pre>';
*/

if ($url) {

	$load = Load::getInstance();
	$load->controller(!$matches[2]? $url['controller'] : $matches[1]);
	$load->method($url['method']);

	$class = $url['controller'];
	$model = (($url['model'])? $url['model'] : '');
	$obj = new $class($model);

	$obj->load->args($url['params']);

	if ($_POST['data'])
		$obj->postdata($_POST['data']);

	// Llamo al metodo
	!empty($url['params'])? call_user_func_array(array($obj, $url['method']), $url['params']) : call_user_func(array($obj, $url['method']));

	// Marco el metodo que se ejecuto
	$obj->load->method($url['method']);

	// Defino que vista se va a renderizar
	if (!($view = $obj->view()))
		$view = $url['controller'].'/'.$url['method'];

//echo '<pre>'.print_r($obj->data, true).'</pre>';
	// Si esta activado el template, lo imprimo
	if ($obj->load->template() && $obj->load->template->autorender()) {
		// Si no hay vista definida, la autodetecto
		if ($scaffold && !$view)
			$view = 'scaffold/'.$url['method'];
		// Desactivo el autorender
		$obj->load->autorender(false);
		// Cargo el contenido en el template
		$obj->load->template->content($obj->load->view($view, $obj->data));
		// Renderizo el template
		$obj->load->template->render();
	}
	// Llamo a la vista del controlador automaticamente (si tiene autorender activado y no fue llamada)
	else if ($obj->load->autorender() && !$obj->load->rendered($url['controller'].'/'.$url['method']))
		$obj->load->view($view, $obj->data);

	exit;
}


include(CONFIG_DOCUMENT_ROOT.$_SERVER['REQUEST_URI']);

?>
